#include"SList.h"


SListNode* CreateNode(DataType x){
  SListNode* newnode=(SListNode*)malloc(sizeof(SListNode));
  newnode->val=x;
  return newnode;
}

void Print(SListNode* phead){
  while(phead!=NULL){
    printf("%d->",phead->val);
    phead=phead->next;
  }printf("\n");
}

void SListPushBack(SListNode**  phead,DataType x){
  SListNode* head=*phead;   
  if(head==NULL){
     SListNode* newnode=CreateNode(x); 
     *phead=newnode;
  }
  else{
    while(head->next!=NULL){
        head=head->next;
    }
    SListNode* newnode=CreateNode(x);
    head->next=newnode;
    newnode->next=NULL;
  }
}
void SListPushFront(SListNode** phead,DataType x){
    assert(phead!=NULL);  
    SListNode* head=*phead; 
    SListNode* newnode=CreateNode(x);
    newnode->next=head;
    *phead=newnode;
}
void SListPopBack(SListNode** phead){
     assert(phead!=NULL);
     SListNode* head=*phead;
     assert(head!=NULL);
     if(head->next==NULL){
        free(head);
        *phead=NULL;
     }
     else{
       SListNode* prev=head;
       while(head->next!=NULL){
           prev=head;
           head=head->next;
       }
       free(head);
       prev->next=NULL;
     }
}
void SListPopFront(SListNode** phead){
     assert(phead);
     SListNode* head=*phead;
     assert(head);
     SListNode* tmp=head->next;
     free(head);
     *phead=tmp;
}

SListNode* SListFind(SListNode* phead,DataType x){
  while(phead!=NULL){
    if(phead->val==x){
      return phead;
    }
    phead=phead->next;
  }
  return NULL;
}

void SListInsertAfter(SListNode* pos,DataType x){
     assert(pos); 
     SListNode* tmp=pos->next;
     SListNode* newnode=CreateNode(x);
     pos->next=newnode;
     newnode->next=tmp;
}

void SListEraseAfter(SListNode* pos){
     assert(pos);
     SListNode* tmp=pos->next;
     assert(tmp);
     pos->next=pos->next->next;
     free(tmp);
}

void SListDestroy(SListNode** pos){
     assert(pos);
     SListNode* head=*pos;
     while(head!=NULL){
        SListNode* tmp=head;
        head=head->next;
        free(tmp);
     }
     *pos=NULL;
}
